import REQ from "@/api/web/REQ.ts"
import {Res} from "@/api/objects"

// 物理内存信息
export interface PhysicalMemoryInfo {
    // 内存条所在的插槽标签
    bankLabel: string
    // 内存容量，单位为字节
    capacity: number
    // 内存条的时钟速度，单位为MHz
    clockSpeed: number
    // 内存制造商名称
    manufacturer: string
    // 内存类型（如DDR3, DDR4等）
    memoryType: string
    // 内存条的序列号
    serialNumber: string
}

//虚拟内存信息
export interface VirtualMemoryInfo {
    // 虚拟内存的最大值，单位为字节
    virtualMax: number
    // 当前正在使用的虚拟内存量，单位为字节
    virtualInUse: number
    // 自启动以来，从磁盘交换到物理内存的页面数
    swapPagesIn: number
    // 自启动以来，从物理内存交换到磁盘的页面数
    swapPagesOut: number
    // 总共可用的交换空间大小，单位为字节
    swapTotal: number
    // 当前已使用的交换空间大小，单位为字节
    swapUsed: number
}

// 内存信息
export interface MemoryInfo {
    // 物理内存信息数组，包含系统中所有物理内存模块的信息
    physicalMemory: PhysicalMemoryInfo[]
    // 虚拟内存信息
    virtualMemory: VirtualMemoryInfo
    // 系统页面大小，单位为字节
    pageSize: number
    // 可用物理内存量，单位为字节
    available: number
    // 总物理内存量，单位为字节
    total: number
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// CPU信息
export interface CpuInfo {
    // 逻辑处理器的数量
    cpuNum: number
    // 总的CPU时间片或ticks数 这个值可能用于计算CPU使用率
    toTal: number
    // 系统占用的CPU百分比（内核态）
    sys: number
    // 用户模式下占用的CPU百分比
    user: number
    // I/O等待时间占总CPU时间的百分比 0表示没有因等待I/O操作完成而空闲的CPU时间
    wait: number
    // 空闲CPU的百分比
    free: number
    // CPU模型信息 包括物理和逻辑处理器数量、标识符等详细描述
    cpuModel: string
    // CPU负载时间信息
    ticks: {
        // CPU处于空闲状态的时间片数
        idle: number
        // 优先级调整过的用户态进程所消耗的CPU时间片数
        nice: number
        // 处理硬件中断所花费的CPU时间片数
        irq: number
        // 处理软件中断所花费的CPU时间片数
        softIrq: number
        // 在虚拟化环境中 其他虚拟机占用本应属于此虚拟机的CPU时间片数
        steal: number
        // 内核态进程消耗的CPU时间片数
        cSys: number
        // 用户态进程消耗的CPU时间片数
        user: number
        // 因等待I/O操作完成而空闲的CPU时间片数
        ioWait: number
    }
    // 已使用的CPU百分比 这是通过将sys、user和其他相关项加起来得到的结果
    used: number
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// 物理处理器信息接口定义
export interface PhysicalProcessor {
    // 物理包编号，表示处理器所在的物理包的标识符
    physicalPackageNumber: number
    // 物理处理器编号，表示在物理包内的处理器编号
    physicalProcessorNumber: number
    // 效率，可能指能效比或其他效率指标
    efficiency: number
    // 标识字符串，用于唯一识别处理器的字符串
    idString: string
}

// 逻辑处理器详细信息接口定义
export interface LogicalProcessor {
    // 逻辑处理器编号，系统中逻辑处理器的唯一编号
    processorNumber: number
    // 关联的物理处理器编号
    physicalProcessorNumber: number
    // 关联的物理包编号
    physicalPackageNumber: number
    // NUMA节点号，非统一内存访问架构中的节点编号
    numaNode: number
    // 处理器组编号，Windows系统中用于管理大量处理器的分组机制
    processorGroup: number
}

// 处理器缓存接口定义
export interface ProcessorCache {
    // 缓存等级，如L1, L2, L3等
    level: number
    // 关联性，描述缓存行与缓存集之间的映射方式
    associativity: number
    // 行大小，每个缓存行的数据量大小
    lineSize: number
    // 缓存大小，整个缓存的容量大小
    cacheSize: number
    // 类型，缓存类型，如数据缓存、指令缓存或统一缓存
    type: string
}

// 处理器信息接口定义
export interface ProcessorInfo {
    // 系统中所有逻辑处理器的信息列表
    logicalProcessors: LogicalProcessor[]
    // 系统中所有物理处理器的信息列表
    physicalProcessors: PhysicalProcessor[]
    // 处理器标识信息
    identifier: {
        // 处理器ID，用于唯一识别处理器
        processorID: string
        // 是否支持64位计算
        cpu64bit: boolean
        // 处理器名称
        name: string
        // 处理器家族编号
        family: number
        // 处理器模型编号
        model: number
        // 厂商频率，通常指处理器的基本频率
        vendorFreq: number
        // 微架构名称
        microarchitecture: string
        // 处理器厂商
        vendor: string
        // 步进版本号，表示处理器修订版本
        stepping: number
        // 详细的处理器标识字符串
        identifier: string
    }
    // 系统中所有处理器缓存的信息列表
    caches: ProcessorCache[]
    // 中断相关信息
    interrupts: string
    // 特性标志列表，表示处理器支持的技术和特性
    featureFlags: string[]
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// 分区信息
export interface PartitionInfo {
    // 分区标识，例如 "磁盘 #0，分区 #1"
    identification: string
    // 分区名称，例如 "GPT: Basic Data"
    name: string
    // 分区类型，例如 "GPT: 基本数据"
    type: string
    // 分区的UUID，例如 "de132453-224f-11ef-ba1d-b025aa3d0c7b"
    uuid: string
    // 分区大小，单位为字节
    size: number
    // 主设备号
    major: number
    // 次设备号
    minor: number
    // 挂载点，例如 "C:\\"
    mountPoint: string
}

// 磁盘信息
export interface DiskInfo {
    // 磁盘名称，例如 "\\\\.\\PHYSICALDRIVE0"
    name: string
    // 磁盘型号，例如 "ZHITAI TiPlus5000 512GB (标准磁盘驱动器)"
    model: string
    // 磁盘序列号，例如 "0000_0000_0000_0000_A428_B700_683C_0081."
    serial: string
    // 磁盘总容量，单位为字节
    size: number
    // 读操作次数
    reads: number
    // 读取的数据总量，单位为字节
    readBytes: number
    // 写操作次数
    writes: number
    // 写入的数据总量，单位为字节
    writeBytes: number
    // 当前等待的IO队列长度
    currentQueueLength: number
    // 数据传输时间，单位为毫秒
    transferTime: number
    // 时间戳，表示最后一次更新的时间，单位为毫秒
    timeStamp: number
    // 分区信息数组
    partitions: PartitionInfo[]
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// 固件信息
export interface FirmwareInfo {
    // 固件描述，例如 "N.1.20MRV15"
    description: string
    // 固件名称，例如 "N.1.20MRV15"
    name: string
    // 固件版本，例如 "ALASKA - 1072009"
    version: string
    // 固件制造商，例如 "American Megatrends Inc."
    manufacturer: string
    // 固件发布日期，格式为 "YYYY-MM-DD"
    releaseDate: string
}

// 基板信息
export interface BaseboardInfo {
    // 基板版本，例如 "Standard"
    version: string
    // 基板型号，例如 "unknown"
    model: string
    // 基板制造商，例如 "MECHREVO"
    manufacturer: string
    // 基板序列号，例如 "Standard"
    serialNumber: string
}

// 系统信息
export interface SystemInfo {
    // 系统固件信息
    firmware: FirmwareInfo
    // 主板（基板）信息
    baseboard: BaseboardInfo
    // 系统模型，例如 "Jiaolong Series GK5NR0O"
    model: string
    // 系统制造商，例如 "MECHREVO"
    manufacturer: string
    // 硬件唯一标识符 (UUID)，例如 "7408E812-19E1-11EB-A58F-C01B08F82300"
    hardwareUUID: string
    // 系统序列号，例如 "420106H320A0990057"
    serialNumber: string
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// usb信息
export interface UsbInfo {
    // USB设备名称
    name: string
    // 生产厂商名称
    vendor: string
    // 厂商ID，用于唯一识别厂商
    vendorId: string
    // 产品ID，用于唯一识别产品
    productId: string
    // 序列号，设备的序列号，通常用于唯一识别具体设备
    serialNumber: string
    // 唯一设备ID，用于在整个系统中唯一识别该USB设备
    uniqueDeviceId: string
    // 连接的子设备列表，表示直接连接到此USB设备的其他USB设备信息
    connectedDevices: UsbInfo[]
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// 显卡信息
export interface GpuInfo {
    // GPU设备名称
    name: string;
    // 设备ID，用于唯一识别GPU设备
    deviceId: string;
    // 生产厂商名称
    vendor: string;
    // 版本信息，包含驱动版本或其他相关版本信息
    versionInfo: string;
    // 视频内存容量，单位通常是MB或GB
    vram: number;
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

export interface NetworkIf {
    // 网络接口名称
    name: string
    // 显示名称
    displayName: string
    // 接口索引
    index: number
    // 最大传输单元
    mtu: number
    // 子网掩码列表
    subnetMasks: Array<string>
    // 前缀长度列表
    prefixLengths: Array<number>
    // 接口类型
    ifType: number
    // NDIS物理介质类型
    ndisPhysicalMediumType: number
    // 连接器是否存在的标志
    connectorPresent: boolean
    // 已接收的字节数
    bytesRecv: number
    // 已发送的字节数
    bytesSent: number
    // 已接收的数据包数
    packetsRecv: number
    // 已发送的数据包数
    packetsSent: number
    // 输入错误数
    inErrors: number
    // 输出错误数
    outErrors: number
    // 输入丢弃的数据包数
    inDrops: number
    // 冲突次数
    collisions: number
    // 速度
    speed: number
    // 时间戳
    timeStamp: number
    // 接口别名
    ifAlias: string
    // 操作状态
    ifOperStatus: string
    // IPv6地址列表
    ipv6addr: Array<string>
    // MAC地址
    macaddr: string
    // IPv4地址列表
    ipv4addr: Array<string>
    // 是否已知VM MAC地址
    knownVmMacAddr: boolean
}

class SystemInfoApi {
    getMemoryInfo = async (): Promise<Res<MemoryInfo>> => {
        return await REQ({
            method: 'get',
            url: '/api/sys/memory',
        })
    }

    getCpuInfo = async (): Promise<Res<CpuInfo>> => {
        return await REQ({
            method: 'get',
            url: '/api/sys/cpu',
        })
    }

    getProcessorInfo = async (): Promise<Res<ProcessorInfo>> => {
        return await REQ({
            method: 'get',
            url: '/api/sys/processor',
        })
    }

    getDiskInfo = async (): Promise<Res<DiskInfo[]>> => {
        return await REQ({
            method: 'get',
            url: '/api/sys/disk',
        })
    }

    getSystemInfo = async (): Promise<Res<SystemInfo>> => {
        return await REQ({
            method: 'get',
            url: '/api/sys/system',
        })
    }

    getUsbTree = async (): Promise<Res<UsbInfo[]>> => {
        return await REQ({
            method: 'get',
            url: '/api/sys/usb',
        })
    }

    getGpuInfo = async (): Promise<Res<GpuInfo[]>> => {
        return await REQ({
            method: 'get',
            url: '/api/sys/gpu',
        })
    }

    getNetworkIF = async (): Promise<Res<NetworkIf[]>> => {
        return await REQ({
            method: 'get',
            url: "/api/sys/network",
        })
    }
}

export default new SystemInfoApi()
